/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package listcontrol;

import controllers.DatabaseController;
import java.net.DatagramPacket;
import java.util.ArrayList;
import java.util.UUID;
import util.ControlParser;

/**
 *
 * @author gravena
 */
public class ActionThread implements Runnable {
    private ControlParser parser;    
    private DatagramPacket packet;
    private final DatabaseController dbController;
    
    public ActionThread(DatabaseController dbController, DatagramPacket packet) {
        //SE POSSÍVEL, USAR APENAS OS MÉTODOS DO DBCONTROLLER, SEM ACESSAR REMOTE LIST        
        this.packet = packet;
        this.parser = new ControlParser(packet.getData());                            
        this.dbController = dbController;
    }
    
    @Override
    public void run(){        
        UUID incoming = UUID.fromString(this.parser.getUUID()); // Pega o UUID do pacote que chegou                
        RemoteFileList peer;
        synchronized(this.dbController) {
            peer = dbController.searchPeer(incoming);
        }
                
        if(peer == null) { // O peer não está registrado
                        
            if(!incoming.equals(LocalFileList.localUuid)) { // Evita que o peer registre a sí próprio
                RemoteFileList newPeer = new RemoteFileList(this.packet.getAddress());
                newPeer.setVersion(this.parser.getVersion());
                newPeer.setUuid(incoming);
                newPeer.setUpdated(true);
                if(newPeer.getFileList()) {                                        
                    synchronized(this.dbController) {
                        dbController.addPeer(newPeer);
                    }
                    System.out.println("Peer " + newPeer.getIp() + " adicionado com sucesso!");
                } else {
                    System.err.println("Erro ao adicionar peer " + newPeer.getIp() + "!");
                }          
            }            
        } else { // Já existe uma lista
            long curVersion = peer.getVersion();
            
            if(curVersion != this.parser.getVersion()) { /* Se as versões forem diferentes seta o peer remoto como desatualizado */
                //peer.setUpdated(false);
                //peer.setVersion(curVersion);                                
                synchronized(this.dbController) {
                    peer.getFileList();
                }
            }
        }                 
    }
}
